// register

#if DAS_FUSION>=2

#define REGISTER_OP1_INTEGER_FUSION_POINT(OPNAME) \
    REGISTER_OP1_FUSION_POINT(OPNAME,Int,int32_t); \
    REGISTER_OP1_FUSION_POINT(OPNAME,UInt,uint32_t); \
    REGISTER_OP1_FUSION_POINT(OPNAME,Int64,int64_t); \
    REGISTER_OP1_FUSION_POINT(OPNAME,UInt64,uint64_t);

#define REGISTER_OP1_NUMERIC_FUSION_POINT(OPNAME) \
    REGISTER_OP1_INTEGER_FUSION_POINT(OPNAME); \
    REGISTER_OP1_FUSION_POINT(OPNAME,Float,float); \
    REGISTER_OP1_FUSION_POINT(OPNAME,Double,double);

#else

#define REGISTER_OP1_INTEGER_FUSION_POINT(OPNAME) \
    REGISTER_OP1_FUSION_POINT(OPNAME,Int,int32_t); \
    REGISTER_OP1_FUSION_POINT(OPNAME,UInt,uint32_t);

#define REGISTER_OP1_NUMERIC_FUSION_POINT(OPNAME) \
    REGISTER_OP1_INTEGER_FUSION_POINT(OPNAME); \
    REGISTER_OP1_FUSION_POINT(OPNAME,Float,float);

#endif

#define REGISTER_OP1_SCALAR_FUSION_POINT(OPNAME) \
    REGISTER_OP1_NUMERIC_FUSION_POINT(OPNAME); \
    REGISTER_OP1_FUSION_POINT(OPNAME,Bool,bool);

#define REGISTER_OP1_WORKHORSE_FUSION_POINT(OPNAME) \
    REGISTER_OP1_SCALAR_FUSION_POINT(OPNAME); \
    REGISTER_OP1_FUSION_POINT(OPNAME,Ptr,StringPtr); \
    REGISTER_OP1_FUSION_POINT(OPNAME,Ptr,VoidPtr);

#if DAS_FUSION>=2

#define REGISTER_OP1_VEC(OPNAME,CTYPE) \
    REGISTER_OP1_FUSION_POINT(OPNAME,,CTYPE)

#define REGISTER_OP1_INTEGER_VEC(OPNAME) \
    REGISTER_OP1_VEC(OPNAME,int2 ); \
    REGISTER_OP1_VEC(OPNAME,uint2); \
    REGISTER_OP1_VEC(OPNAME,int3 ); \
    REGISTER_OP1_VEC(OPNAME,uint3); \
    REGISTER_OP1_VEC(OPNAME,int4 ); \
    REGISTER_OP1_VEC(OPNAME,uint4);

#define REGISTER_OP1_NUMERIC_VEC(OPNAME) \
    REGISTER_OP1_INTEGER_VEC(OPNAME); \
    REGISTER_OP1_VEC(OPNAME,float2 ); \
    REGISTER_OP1_VEC(OPNAME,float3 ); \
    REGISTER_OP1_VEC(OPNAME,float4 );

#else

#define REGISTER_OP1_NUMERIC_VEC(OPNAME)

#endif

